﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace 反射
{
    class Program
    {
        static void Main(string[] args)
        {
            //System.Reflection.MemberInfo info = typeof(MyClass);
            //object[] attributes = info.GetCustomAttributes(true);
            //Console.WriteLine(attributes.Length);
            //for (int i = 0; i < attributes.Length; i++)
            //{
            //    System.Console.WriteLine(attributes[i]);
            //}

            Rectangle r = new Rectangle(4.5, 7.5);
            // r.Display();
            Type type = typeof(Rectangle);

            FieldInfo[] fieldInfos = type.GetFields(); // 返回公共的字段列表
            Console.WriteLine("公共字段的个数:{0}",fieldInfos.Length);
            PropertyInfo[] properties = type.GetProperties();// 获取所有公共的属性列表
            Console.WriteLine("所有公共属性的个数:{0}",properties.Length);
            foreach (PropertyInfo propertyInfo in properties)
            {
                Console.WriteLine(propertyInfo.ToString());
                Type propertyType = propertyInfo.PropertyType;
                string name = propertyInfo.Name;
                Module module = propertyInfo.Module;
                Console.WriteLine("模块:{0},属性类型：{1}",module.Name,propertyType.Name);
            }
            Console.WriteLine("==================分隔符=========================");
            Console.WriteLine(type.FullName);
            Console.WriteLine(type.Assembly.GetName().Name);

            // 反射获取方法的信息
            MethodInfo[] methodInfos = type.GetMethods();
            Console.WriteLine(methodInfos.Length);
            foreach (MethodInfo methodInfo in methodInfos)
            {
                // Console.WriteLine("{0},{1}",methodInfo.Name,methodInfo.Attributes);
                if (methodInfo.Name.Equals("Display"))
                {
                    methodInfo.Invoke(r,null);
                }
            }

            Console.WriteLine("==========================");

            AssemblyName assemblyName = type.Assembly.GetName();
            Console.WriteLine(assemblyName.FullName);
            Console.WriteLine(assemblyName.Name);

            Console.WriteLine("==========================");

            Rectangle r2 = ReflectionHelper.CreateInstance<Rectangle>("反射", "反射", "Rectangle");
            //r2 = (Rectangle) Assembly.Load("反射").CreateInstance("反射.Rectangle", false);
            r2.Width = 10;
            r2.Length = 90;
            r2.Display();

            Console.WriteLine("==================分隔符=========================");
            Rectangle r3 = (Rectangle)Assembly.Load("反射").CreateInstance("反射.Rectangle", false);
            r3.Width = 45;
            r3.Length = 78;
            //r3.Display();
            ReflectionHelper.GetInvokeVoidMethod(r3, "Display", null);

            // 遍历 Rectangle 类的特性
            //foreach (Object attributes in type.GetCustomAttributes(false))
            //{
            //    DeBugInfo dbi = (DeBugInfo)attributes;
            //    if (null != dbi)
            //    {
            //        Console.WriteLine("Bug no: {0}", dbi.BugNo);
            //        Console.WriteLine("Developer: {0}", dbi.Developer);
            //        Console.WriteLine("Last Reviewed: {0}",dbi.LastReview);
            //        Console.WriteLine("Remarks: {0}", dbi.Message);
            //    }
            //}

            // 遍历方法特性
            //foreach (MethodInfo m in type.GetMethods())
            //{
            //    foreach (Attribute a in m.GetCustomAttributes(true))
            //    {
            //        DeBugInfo dbi = (DeBugInfo)a;
            //        if (null != dbi)
            //        {
            //            Console.WriteLine("Bug no: {0}, for Method: {1}",dbi.BugNo, m.Name);
            //            Console.WriteLine("Developer: {0}", dbi.Developer);
            //            Console.WriteLine("Last Reviewed: {0}",dbi.LastReview);
            //            Console.WriteLine("Remarks: {0}", dbi.Message);
            //        }
            //    }
            //}
            Console.ReadLine();
        }
    }


    [AttributeUsage(AttributeTargets.All)]
    public class HelpAttribute : System.Attribute
    {
        public readonly string Url;

        public string Topic  // Topic 是一个命名（named）参数
        {
            get
            {
                return topic;
            }
            set
            {
                topic = value;
            }
        }

        public HelpAttribute(string url)  // url 是一个定位（positional）参数
        {
            this.Url = url;
        }

        private string topic;
    }

    [HelpAttribute("Information on the class MyClass")]
    class MyClass
    {

    }


    // 一个自定义特性 BugFix 被赋给类及其成员
    [AttributeUsage(AttributeTargets.Class | AttributeTargets.Constructor |
    AttributeTargets.Field | AttributeTargets.Method | AttributeTargets.Property,AllowMultiple = true)]
    public class DeBugInfo : System.Attribute
    {
        private int bugNo;
        private string developer;
        private string lastReview;
        public string message;

        public DeBugInfo(int bg, string dev, string d)
        {
            this.bugNo = bg;
            this.developer = dev;
            this.lastReview = d;
        }

        public int BugNo
        {
            get
            {
                return bugNo;
            }
        }
        public string Developer
        {
            get
            {
                return developer;
            }
        }
        public string LastReview
        {
            get
            {
                return lastReview;
            }
        }
        public string Message
        {
            get
            {
                return message;
            }
            set
            {
                message = value;
            }
        }
    }

    [DeBugInfo(45, "Zara Ali", "12/8/2012",Message = "Return type mismatch")]
    [DeBugInfo(49, "Nuha Ali", "10/10/2012",Message = "Unused variable")]
    class 
        Rectangle
    {
        // 成员变量
        protected double length;
        protected double width;

        public Rectangle()
        {

        }

        public Rectangle(double l, double w)
        {
            length = l;
            width = w;
        }

        public double Length
        {
            get
            {
                return length;
            }
            set
            {
                length = value;
            }
        }

        public double Width
        {
            get
            {
                return width;
            }
            set
            {
                width = value;
            }
        }

        [DeBugInfo(55, "Zara Ali", "19/10/2012",Message = "Return type mismatch")]
        public double GetArea()
        {
            return length * width;
        }
        [DeBugInfo(56, "Zara Ali", "19/10/2012")]
        public void Display()
        {
            Console.WriteLine("Length: {0}", length);
            Console.WriteLine("Width: {0}", width);
            Console.WriteLine("Area: {0}", GetArea());
        }
    }//end class Rectangle  

}
